package conservare.boleto.service;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.Date;

import org.jrimum.bopepo.view.BoletoViewer;

import conservare.boleto.GeradorBoleto;
import conservare.boleto.GeradorBoletoFactory;
import conservare.boleto.BoletoEmitidoBuilder;
import conservare.modelo.banco.CarteiraBoleto;
import conservare.modelo.banco.Conta;
import conservare.modelo.boleto.BoletoEmitido;
import conservare.modelo.financeiro.ContaAReceber;
import conservare.negocio.BoletoEmitidoRN;

public class GeradorBoletoService {

	private CarteiraBoleto carteiraBoleto;
	private BoletoEmitido infoBoleto;
	
	public GeradorBoletoService(ContaAReceber contaAReceber,
			Conta contaBancaria, 
			CarteiraBoleto carteiraBoleto,
			Date dataDoDocumento,
			Date dataDoVencimento,
			BigDecimal valorDoDocumento,
			BigDecimal valorJurosMora, 
			BigDecimal valorMulta) {
		
		super();

		this.carteiraBoleto = carteiraBoleto;
		
		BoletoEmitidoBuilder infoBoletoBuilder = new BoletoEmitidoBuilder();
		infoBoletoBuilder.buildContaAReceber(contaAReceber);
		infoBoletoBuilder.buildContaBancaria(contaBancaria);
		infoBoletoBuilder.buildDataDoDocumento(new Date());
		infoBoletoBuilder.buildDataDoVencimento(dataDoVencimento);
		infoBoletoBuilder.buildNumeroDoDocumento(BoletoEmitidoRN.gerarSequencialBoleto(carteiraBoleto));
		infoBoletoBuilder.buildValorDoDocumento(valorDoDocumento);
		infoBoletoBuilder.buildValorJurosMora(valorJurosMora);
		infoBoletoBuilder.buildValorMulta(valorMulta);
		infoBoletoBuilder.buildPagador(contaAReceber.getContrato().getResponsavelLocalPrestacaoServico());
		
		this.infoBoleto = infoBoletoBuilder.getInfoBoleto();
		
	}
	
	public InputStream executa() throws Exception{
		
		BoletoViewer boletoViewer = null;
		GeradorBoleto geradorBoleto = null;
		
			
		geradorBoleto = GeradorBoletoFactory.criarGeradorBoleto(infoBoleto, carteiraBoleto);
		boletoViewer = geradorBoleto.executar();
			
		
		infoBoleto.setNossoNumero(geradorBoleto.getNossoNumeroParaExibicao());
		
		new BoletoEmitidoRN().salvar(infoBoleto);
		
		return new ByteArrayInputStream(boletoViewer.getPdfAsStream().toByteArray());
		
	}
	
	
	
	
	
	
	
	
}
